package sanrenxing.dayEnd.backRepertoryTotal.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import sanrenxing.dayEnd.backRepertoryTotal.dao.TransactionDao;
import sanrenxing.dayEnd.backRepertoryTotal.domain.EquityData;
import sanrenxing.dayEnd.backRepertoryTotal.domain.EquityDataT;
import sanrenxing.dayEnd.backRepertoryTotal.service.DaysBiz;
import sanrenxing.dayEnd.backRepertoryTotal.service.EquityDataService;
import sanrenxing.dayEnd.backRepertoryTotal.utils.ExclUtils;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * @desrciption 权益数据 控制器类
 * @auth：yidu  李小锋
 * @date:2021/3/13 0013 - 15:12
 * @version:1:0
 */
@Controller
@RequestMapping("/EquityDatas")
public class EquityDataController {
    //自动装配
    @Autowired
    //调用权益数据业务层对象
    private EquityDataService equityDataService;
    //自动装配
    @Autowired  
    //证券交易数据对象
    private TransactionDao transactionDao;
    //自动装配按类型和名称
    @Resource
    //日历DaysBiz
    private DaysBiz daysIm;
    /**
     * 分页查询
     * @param req 请求对象
     * @param page 页数
     * @param limit 行数
     * @return 返回map集合从后端填充数据到前端
     */
    @GetMapping("/EquityData")
    @ResponseBody
    public Map<String,Object> selectEquity(HttpServletRequest req, int page, int limit){
        //构造一个新对象用于保存
        EquityData equityData = new EquityData();
        //接收来自请求中的权益类型rigType
        String rigType = req.getParameter("rigType");
        //判断不为空切不等于零
        if(rigType!=null && rigType.trim().length()!=0){
            //判断是送股
            if(rigType.equals("送股")){
                //设置接收对象2表示送股
                rigType="2";
                //保存权益数据
                equityData.setRigType(rigType);
                //判断是分红
            }else if(rigType.equals("分红")){
                //定义1表示分红
                rigType="1";
                //保存权益数据
                equityData.setRigType(rigType);
                //判断是分红和送股
            }else if(rigType.equals("分红和送股")){
                //定义3表示分红和送股
                rigType="3";
                //保存权益数据
                equityData.setRigType(rigType);
            }
        }
        //接收来自请求中的权益除权日righDay
        String righDay = req.getParameter("righDay");
        //判断不为空切不等于零
        if(righDay!=null && righDay.trim().length()!=0){
            //创建一个日期String转换为日期格式
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            //保存权益数据
            try {
                //将请求中的对象进行格式转换
                equityData.setRighDay(sdf.parse(righDay));
            } catch (ParseException e) {
                //异常打印信息
                e.printStackTrace();
            }
        }
        //调用数据方法根据权证对象构造多条件数据
        String getcondition = equityDataService.getcondition(equityData);
        //执行多条件查询分页
        List<EquityData> dataList = equityDataService.findByPage( limit,page, getcondition);
        //多表查询表中总记录数
        int count = equityDataService.count(getcondition);
        //定义映射集合对象
        HashMap<String, Object> equityMap = new HashMap<>();
        //在映射集合中添加key为code，值为0的状态码
        equityMap.put("code",0);
        //在映射集合中添加key为msg,值为响应信息字符串
        equityMap.put("msg","");
        //在映射集合中添加key为data,值为员集合对象
        equityMap.put("data",dataList);
        //在映射集合中添加key为count,值总行数的数据对
        equityMap.put("count",count);
        //调用证券交易对象中的SecuritiesInfomationLXF
        equityMap.put("Securities",transactionDao.SecuritiesInfomationLXF());
        //调用日历类的中all方法
        equityMap.put("da",daysIm.all());
        //向前端发送数据
        return equityMap;
    }
    /**
     * 新增方法
     * @param equityData 对象
     * @return 0,failure 1，SUCCESS
     */
    @PostMapping("/EquityData")
    @ResponseBody
    public String add(@RequestBody EquityData equityData){
        //获取添加的行数
        int rows = equityDataService.add(equityData);
        //使用三元运算符判断
        return rows>0?"add SUCCESS":"add failure";
    }
    /**
     * 删除方法
     * @param rightsId 证券编号
     * @return 0,failure 1，SUCCESS
     */
    @DeleteMapping("/delete/{rightsId}")
    @ResponseBody
    //PathVariable：接收请求路径中占位符的值括号中可有可无但是必须一样
    public String delete(@PathVariable("rightsId") int rightsId){
        //获取删除的行数
        int rwos=equityDataService.delete(rightsId);
        //使用三元运算符判断
        return rwos>0?"delete SUCCESS":"delete failure";
    }
    /**
     * 修改方法方法
     * @param equityData 对象
     * @return 0,failure 1，SUCCESS
     */
    @PutMapping("/EquityData")
    @ResponseBody
    //RequestBody:表示前端传递的json格式转化为javaBean即domain
    //ResponseBody:表示后端传递的javaBean格式转化为json格式
    public String update(@RequestBody EquityData equityData){
        //获取修改的行数
        int rwos=equityDataService.update(equityData);
        //使用三元运算符判断
        return rwos>0?"update SUCCESS":"update failure";
    }

    /**
     * 批量删除
     * @param tranIdStr 数据证券ID
     * @return 0,failure 1，SUCCESS
     */
    @PutMapping("/batchBel/{tranIdStr}")
    @ResponseBody
    public String batchBeleteById(@PathVariable("tranIdStr") String tranIdStr) {
        //对员工编号字符串按逗号分隔
        String[] empNos = tranIdStr.split(",");
        //定义返回值
        String result = "delete success";
        //循环遍历出证券数据id
        for (String equityData : empNos) {
            //调用业务层删除
            int rows = equityDataService.delete(Integer.parseInt(equityData));
            //判断
            if (rows <= 0) {
                //向前端发送错误信息
                return "batch delete failure";
            }
        }
        //向前端发送数据
        return result;
    }

    /**
     * excl表导入方法
     * @param request
     * @return
     * @throws Exception
     */
    @RequestMapping("/form")
    public String form(HttpServletRequest request)throws Exception{
        //创建MultipartHttpServletRequest spring文件对象等于request转
        MultipartHttpServletRequest servletRequest= (MultipartHttpServletRequest) request;
        //定义输入流对象
        InputStream in=null;
        //创建一个list集合嵌套list集合
        List<List<Object>> listob=null;
        //创建MultipartFile 上传文件getfile上传对象 upfile
        MultipartFile upfile = servletRequest.getFile("upfile");
        //判断文件是否存在isempty
        if(upfile.isEmpty()){
            //抛出异常错误信息tnEx
            throw  new Exception("文件不存在");
        }
        //实例化输入流对象getinput
        in = upfile.getInputStream();
        //实例化Exclutils对象getBankListByExcel)in,file.getoriginalfilename;
        listob=new ExclUtils().getBankListByExcel(in,upfile.getOriginalFilename());
        //关闭流
        in.close();
        //创建一个日期转换格式sdf
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        //该处可调用service相应方法进行数据保存到数据库中，现只对数据输出
        for (int i=0;i<listob.size(); i++) {
            //创建一个存储集合对象类型get
            List<Object> lo = listob.get(i);
            //创建权益对象EquityDataT
            EquityDataT equityDataT = new EquityDataT();
            //将元素0封装到RightsId
            equityDataT.setRightsId((int)Double.parseDouble(lo.get(0).toString()));
            //将元素封装到SeId
            equityDataT.setSeId(lo.get(1).toString());
            //将元素封装到RigDay
            equityDataT.setRigDay(lo.get(2).toString());
            //将元素封装到RighDay
            equityDataT.setRighDay(lo.get(3).toString());
            //将元素封装到DueDate
            equityDataT.setDueDate(lo.get(4).toString());
            //将元素封装到RigType
            equityDataT.setRigType((int)Double.parseDouble(lo.get(5).toString()));
            //将元素封装到Pro
            equityDataT.setPro(Double.parseDouble(lo.get(6).toString()));
            //将元素封装到ProState
            equityDataT.setProState((int)Double.parseDouble(lo.get(7).toString()));
            //将元素封装到BusinDate
            equityDataT.setBusinDate(lo.get(8).toString());
            //调用excl导入方法
            equityDataService.addExcl(equityDataT);
        }
        //发送视图redirect:/html/EquityDataLXF.html
        return "redirect:/html/EquityDataLXF.html";
    }

}
